#ifndef CIRCLE_H
#define CIRCLE_H

/**
 * \file Circle.h
 * \brief Fichier contenant la dclaration de la classe Circle
 */

#include <common/meshmodel.h>
#include <common/interfaces.h>

#include <math.h>


class Circle
{
	/* \class Circle
	* \brief Cette classe reprsente un cercle dans l'espace de Hough.
	*/
	private :

	float A;        /*!<Coordonne X du centre du cercle.*/
	float B;        /*!<Coordonne Y du centre du cercle.*/
	float C;        /*!<Coordonne Z du centre du cercle.*/
	float R;        /*!<Rayon du cercle.*/

	public :

	/*!
	*  \brief Constructeur de la classe Circle
	*
	*  Constructeur par dfaut de la classe Circle
	*/
	Circle(void);

	/*!
	*  \brief Constructeur de la classe Circle
	*
	*  Constructeur de la classe Circle
	*
	* \param _a : Coordonne X du centre du cercle.
	* \param _b : Coordonne Y du centre du cercle.
	* \param _r : Rayon du cercle.
	*/
	Circle(float _a, float _b, float _r);

	/*!
	*  \brief Constructeur de la classe Circle
	*
	*  Constructeur de la classe Circle
	*
	* \param _a : Coordonne X du centre du cercle.
	* \param _b : Coordonne Y du centre du cercle.
	* \param _c : Coordonne Z du centre du cercle.
	* \param _r : Rayon du cercle.
	*/
	Circle(float _a, float _b, float _c, float _r);

	/*!
	*  \brief Constructeur de la classe Circle
	*
	*  Constructeur de la classe Circle.
	*      Permet de construire un cercle  partir de trois points dans l'espace 
	*
	* \param _p1 : Premier point appartenant au cercle.
	* \param _p2 : Deuxime point appartenant au cercle.
	* \param _p3 : Troisiem point appartenant au cercle.
	*/
	Circle(CVertexO _p1, CVertexO _p2, CVertexO _p3);

	/*!
	*  \brief Constructeur de la classe Circle
	*
	*  Constructeur de copie de la classe Circle
	*
	* \param _c : Cercle  copier.
	*/
	Circle(const Circle & _c);

	/*!
	*  \brief Destructeur de la classe Circle
	*
	*  Destructeur de la classe Circle
	*/
	~Circle();

	/*!
	*  \brief Modificateur de la classe Circle
	*
	*  Modificateur de la classe Circle
	*
	*  \param _a : Coordonne X du centre du cercle.
	*  \param _b : Coordonne Y du centre du cercle.
	*  \param _r : Rayon du cercle.
	*  \return : void
	*/
	void setABR(float _a, float _b, float _r);

	/*!
	*  \brief Modificateur de la classe Circle
	*
	*  Modificateur de la classe Circle
	*
	*  \param _a : Coordonne X du centre du cercle.
	*  \param _b : Coordonne Y du centre du cercle.
	*  \param _c : Coordonne Y du centre du cercle.
	*  \param _r : Rayon du cercle.
	*  \return : void
	*/
	void setABCR(float _a, float _b, float _c, float _r);

	/*!
	*  \brief Accesseur de la classe Hough
	*
	*  Accède à A
	*
	* \return : Coordonne X du centre du cercle.
	*/
	inline float getA(void) { return this->A; }

	/*!
	*  \brief Accesseur de la classe Hough
	*
	*  Accède à B
	*
	* \return : Coordonne Y du centre du cercle.
	*/
	inline float getB(void) { return this->B; }

	/*!
	*  \brief Accesseur de la classe Hough
	*
	*  Accède à C
	*
	* \return : Coordonne Y du centre du cercle.
	*/
	inline float getC(void) { return this->C; }

	/*!
	*  \brief Accesseur de la classe Hough
	*
	*  Accède à R
	*
	* \return : Rayon du cercle.
	*/
	inline float getR(void) { return this->C; }

	/*!
	*  \brief Affiche le cercle dans l'espace.
	*
	*  Affiche le cercle reprsent par A, B et R dans l'espace.
	*      Le cercle est inscrit dans un plan horizontal.
	*
	*  \param _z : altitude du cercle.
	*  \return : void
	*/
	void draw( float _z = 0.0 );

	/*!
	*  \brief Affiche le cercle dans l'espace en couleur choisie.
	*
	*  Affiche le cercle reprsent par A, B et R dans l'espace en couleur.
	*      Le cercle est inscrit dans un plan horizontal.
	*
	*  \param _z : altitude du cercle.
	*  \param _r : canal rouge de la couleur à afficher.
	*  \param _g : canal vert de la couleur à afficher.
	*  \param _b : canal bleu de la couleur à afficher.
	*  \return : void
	*/
	void draw( float _z, float _r, float _g, float _b );

	/*!
	*  \brief Affiche les attributs du cercle dans la console.
	*
	*  Affiche les attributs du cercle dans la console.
	*
	*  \return : void
	*/
	void print();

	/*!
	*  \brief Calcule si deux cercles s'intersectent.
	*
	*  Caclule si le cercle s'intersecte avec le cercle passé en paramètre.
	*
	*      \param _c : Cercle dont on teste l'intersection avec le cercle courant.
	*  \return : bool
	*/
	bool intersect(Circle _c);

	/*!
	*  \brief Calcule si deux cercles s'intersectent.
	*
	*  Caclule si le cercle s'intersecte, coupe, ou non, le cercle passé en paramètre.
	*
	*      \param _c : Cercle dont on teste l'intersection avec le cercle courant.
	*  \return : Renvoie 1 si les cercles se coupent, 0 si l'un est inscrit dans l'autre et -1 sinon.
	*/
	int conflict(Circle _c);

};

#endif


